﻿// Copyright (c) 2009 Paul Kohler
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
// and associated documentation files (the "Software"), to deal in the Software without restriction, 
// including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
// and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do 
// so, subject to the following conditions:
// 
// The above copyright notice and this permission notice shall be included in all copies or substantial 
// portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// 
using System;

namespace FileSystemDatabase.Exceptions
{
	[Serializable]
	public class FileSystemDatabaseException : Exception
	{
		public FileSystemDatabaseException()
			: this(ErrorType.General, null, null)
		{
		}

		public FileSystemDatabaseException(ErrorType errorType)
			: this(errorType, null, null)
		{
			ErrorType = errorType;
		}

		public FileSystemDatabaseException(string message)
			: this(ErrorType.General, message, null)
		{
		}

		public FileSystemDatabaseException(string message, Exception inner)
			: this(ErrorType.General, message, inner)
		{
		}

		public FileSystemDatabaseException(ErrorType errorType, string message, Exception inner)
			: base(message, inner)
		{
			ErrorType = errorType;
		}

		/// <summary>
		/// Gets or sets the type of the error (Read, Write etc).
		/// </summary>
		/// <value>The type of the error.</value>
		public ErrorType ErrorType { get; set; }

		/// <summary>
		/// Creates an exception by the <paramref name="errorType"/>.
		/// </summary>
		/// <param name="errorType">Type of the error.</param>
		/// <param name="message">The message.</param>
		/// <param name="inner">The inner exception (if any).</param>
		/// <returns>An exception instance.</returns>
		public static FileSystemDatabaseException Create(ErrorType errorType, string message, Exception inner)
		{
			FileSystemDatabaseException exp;

			switch (errorType)
			{
				case ErrorType.Read:
					exp = new FileSystemDatabaseReadException(message, inner);
					break;

				case ErrorType.Write:
					exp = new FileSystemDatabaseWriteException(message, inner);
					break;

				case ErrorType.Delete:
					exp = new FileSystemDatabaseDeleteException(message, inner);
					break;

				default:
					exp = new FileSystemDatabaseException(errorType, message, inner);
					break;
			}

			return exp;
		}
	}
}